package chapter05;

public class Java09_Object {

    public static void main(String[] args) {
        // TODO 常用类和对象-比较
        // 等于
        int i = 10;
        int j = 10;
        System.out.println(i == j); // true
        double d = 10.0;
        System.out.println(i == d); // true
        // ∴基本数据类型的比较只要数值相等，就为true

        String s = "abc";   // 字符串常量值
        String s1 = "abc";
        String s2 = new String("abc");
        System.out.println(s == s1);    // true
        System.out.println(s == s2);    // false
        // Java对值相等的字符串进行了优化，把重复出现的字符串封装成了常量，共同指向同一款内存地址
        // 基本数据类型双等号(==)比较的是数值，引用数据类型双等号比较的是内存地址
        System.out.println(s.equals(s2));   // true
        // equals方法比较的是内容，所以返回true

        User9 user1 = new User9();
        User9 user2 = new User9();
        System.out.println(user1 == user2); // false
        System.out.println(user1.equals(user2));    // false
        // 对象的equals()使用的是Object类的方法，底层逻辑仍然为==，为了判断类中属性方法等是否相等需要重写equals()方法

        // 包装类型
        // int -> Integer => JVM为了操作方便，简化了操作
        // 本质操作为 Integer i1 = Integer.valueOf(110);具有Integer缓存：-128~127
        Integer i1 = 129;
        Integer i2 = 129;
        System.out.println(i1 == i2);   // false
        System.out.println(i1.equals(i2));  // true

        /*
            总结：
            1.基本数据类型的相等比较采用双等号==
            2.引用数据类型的相等比较采用equals()
         */
    }
}
class User9 {
    // 重写equals()时可以搭配重写hashCode()，对象相等表明对象的内存地址在逻辑上也相等
    @Override
    public int hashCode() {
        return 1;
    }

    @Override
    public boolean equals(Object obj) {
        return true;
    }
}
